package com.wlyuan.open.dto.api.order;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.hibernate.validator.constraints.Length;

import javax.validation.Valid;
import javax.validation.constraints.DecimalMax;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Pattern;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.List;

/**
 * @author lijing
 * @description
 */
@Data
@RequiredArgsConstructor
public class OpenApiOrderCreationDTO implements Serializable {

    private static final long serialVersionUID = 1584294728021774156L;
    @NotBlank(message = "合同编号不能为空")
    @Length(max = 30, message = "合同编号最多可输入30个字符")
    @Pattern(regexp = "[[0-9][-_()&+\\/\\[\\]]a-zA-Z]{1,30}", message = "合同编号超出最大长度限制,请确定在30个字以内，只可输入英文、数字、特殊字符。特殊字符只能是英文字符，包含：- _ () & + / []")
    @ApiModelProperty(value = "合同编号", required = true)
    private String contractNo;

    @ApiModelProperty(value = "发货省份  例如：湖南省", required = true)
    @NotBlank(message = "发货省份不能为空")
    private String fromProvince;
    @ApiModelProperty(value = "发货城市  例如：长沙市", required = true)
    @NotBlank(message = "发货城市不能为空")
    private String fromCity;
    @ApiModelProperty(value = "发货区县  例如：岳麓区", required = true)
    @NotBlank(message = "发货区/县不能为空")
    private String fromDistrict;
    @ApiModelProperty(value = "发货时间，yyyy-MM-dd HH:mm:ss，不传值为当前时间")
    private String fromTime;
    @ApiModelProperty(value = "发货详细地址", required = true)
    @NotBlank(message = "发货详细地址不能为空")
    @Length(max = 100, message = "发货详细地址最多可输入100个字符")
    private String fromAddress;
    @NotBlank(message = "发货方联系电话不能为空")
    @ApiModelProperty(value = "发货方联系电话", required = true)
    @Length(max = 50, message = "联系电话最多可输入50个字符")
    private String fromContactMobile;
    @NotBlank(message = "发货联系人不能为空")
    @Length(max = 20, message = "联系人最多可输入20个字符")
    @ApiModelProperty(value = "发货联系人", required = true)
    private String fromContact;

    @ApiModelProperty(value = "收货省份  例如：湖南省", required = true)
    @NotBlank(message = "收货省份不能为空")
    private String toProvince;
    @ApiModelProperty(value = "收货城市  例如：长沙市", required = true)
    @NotBlank(message = "收货城市不能为空")
    private String toCity;
    @ApiModelProperty(value = "收货区县  例如：岳麓区", required = true)
    @NotBlank(message = "收货区/县不能为空")
    private String toDistrict;
    @ApiModelProperty(value = "收货详细地址", required = true)
    @NotBlank(message = "收货详细地址不能为空")
    @Length(max = 100, message = "收货详细地址最多可输入100个字符")
    private String toAddress;
    @NotBlank(message = "收货方联系电话不能为空")
    @ApiModelProperty(value = "收货方联系电话", required = true)
    @Length(max = 50, message = "联系电话最多可输入50个字符")
    private String toContactMobile;
    @NotBlank(message = "收货联系人不能为空")
    @Length(max = 20, message = "联系人最多可输入20个字符")
    @ApiModelProperty(value = "收货联系人", required = true)
    private String toContact;
    @ApiModelProperty(value = "收货时间，yyyy-MM-dd HH:mm:ss 不传值为发货时间加一天")
    private String toTime;

    @ApiModelProperty(value = "客户名称，默认为本公司名称")
    @NotBlank(message = "客户名称不能为空")
    private String customerName;
    @Length(max = 80)
    @ApiModelProperty(value = "收货方名称，不传值，取toMan（收货联系人）的值")
    private String consigneeName;

    @ApiModelProperty(value = "最大批次  注:无特殊情况传1,用于订单物品信息太多的处理，比如订单的物品是</br>"
            + "601条，每次订单过来只能带200条物品信息，那么批次为4")
    private Integer maxBatch;

    @ApiModelProperty(value = "当前批次  注:无特殊情况传1，用于订单物品信息太多的处理，比如订单的物品</br>"
            + "是601条，每次订单过来只能带200条物品信息，当前订单其他信息不变，就改变</br>"
            + "当前的批次。当前批次和最大批次相等的时候才会最终转换订单数据")
    private Integer currentBatch;

    @ApiModelProperty(value = "电子回单号")
    private String deviceCode;
    @ApiModelProperty(value = "设备类型 1 电子回单 2 快递")
    private Integer trackType;

    @ApiModelProperty(value = "描述")
    private String description;

    @ApiModelProperty(value = "物品明细", required = true)
    @Valid
    private List<OpenApiGoodsCreationDTO> detail;

    @ApiModelProperty(value = "运输模式，1零担 2整车，不传值默认零担", example = "1")
    private Integer transportMode;

    @ApiModelProperty(value = "<span style='color: #FF0000;'>只有在transportMode为整车类型的时候才需要填写</span></br>"
            + "    <span>车型， 1半挂车 2高栏车 3厢式货车 4平板车 5敞车 6冷藏车 7面包车 8特种车辆 </span></br>"
            + "    <span>9集卡车 10其他车型 11按载重</span>")
    private Integer carType;

    @ApiModelProperty(value = "<span style='color:#FF0000;'>只有在transportMode为整车类型的时候才需要填写</span></br>"
            + "    <span>规格/车长(米)，需要与车型对应</span></br>"
            + "     @"
            + "     1半挂车 :\n"
            + "     车长(米)可输入13、15、17.5、18、20、其他\n"
            + "     车长为13米时，对应的容积为75立方米，载重为30吨\n"
            + "     车长为15米时，对应的容积为115立方米，载重为40吨\n"
            + "     车长为17.5米时，对应的容积为130立方米，载重为32吨\n"
            + "     车长为18米时，对应的容积为160立方米，载重为45吨\n"
            + "     车长为20米时，对应的容积为180立方米，载重为50吨\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     2高栏车 :\n"
            + "     车长(米)可输入4.2、6.8、7.2、7.6、8、9.6、12.5、13、17.5、其他\n"
            + "     车长为4.2米时，对应的容积为15立方米，载重为3吨\n"
            + "     车长为6.8米时，对应的容积为35立方米，载重为8吨\n"
            + "     车长为7.2米时，对应的容积为40立方米，载重为8吨\n"
            + "     车长为7.6米时，对应的容积为42立方米，载重为8吨\n"
            + "     车长为8米时，对应的容积为45立方米，载重为8吨\n"
            + "     车长为9.6米时，对应的容积为55立方米，载重为12吨\n"
            + "     车长为12.5米时，对应的容积为70立方米，载重为25吨\n"
            + "     车长为13米时，对应的容积为75立方米，载重为30吨\n"
            + "     车长为17.5米时，对应的容积为130立方米，载重为32吨\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     3厢式货车 :\n"
            + "     车长(米)可输入4.2、5.2、6.2、6.8、7.6、9.6、13、17.5、其他\n"
            + "     车长为4.2米时，对应的容积为12立方米，载重为2.5吨\n"
            + "     车长为5.2米时，对应的容积为25立方米，载重为5吨\n"
            + "     车长为6.2米时，对应的容积为30立方米，载重为7吨\n"
            + "     车长为6.8米时，对应的容积为35立方米，载重为8吨\n"
            + "     车长为7.6米时，对应的容积为40立方米，载重为8吨\n"
            + "     车长为9.6米时，对应的容积为50立方米，载重为12吨\n"
            + "     车长为13米时，对应的容积为70立方米，载重为30吨\n"
            + "     车长为17.5米时，对应的容积为120立方米，载重为32吨\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     4平板车 :\n"
            + "     车长(米)可输入2.5、3.9、4.2、5.2、5.8、6.2、6.8、7.6、9.6、13、17.5、其他\n"
            + "     车长为2.5米时，对应的容积为10立方米，载重为1.5吨\n"
            + "     车长为3.9米时，对应的容积为12立方米，载重为2.5吨\n"
            + "     车长为4.2米时，对应的容积为15立方米，载重为3吨\n"
            + "     车长为5.2米时，对应的容积为28立方米，载重为5吨\n"
            + "     车长为5.8米时，对应的容积为30立方米，载重为6吨\n"
            + "     车长为6.2米时，对应的容积为30立方米，载重为8吨\n"
            + "     车长为6.8米时，对应的容积为35立方米，载重为10吨\n"
            + "     车长为7.6米时，对应的容积为42立方米，载重为10吨\n"
            + "     车长为9.6米时，对应的容积为55立方米，载重为15吨\n"
            + "     车长为13米时，对应的容积为75立方米，载重为30吨\n"
            + "     车长为17.5米时，对应的容积为130立方米，载重为32吨\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     5敞车 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     6冷藏车 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     7面包车 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     8特种车辆 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     9集卡车 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     10其他车型 :\n"
            + "     车长选择其他时，自主输入车长、容积和载重，容积最大值为999.999999，载重最大值为99.9999\n\n"
            + "     11按载重 :\n"
            + "     规格/车长(米)可输入5、8、10、16\n"
            + "     规格/车长为5吨时，对应的容积为25立方米，载重为5吨\n"
            + "     规格/车长为8吨时，对应的容积为30立方米，载重为8吨\n"
            + "     规格/车长为10吨时，对应的容积为35立方米，载重为10吨\n"
            + "     规格/车长为16吨时，对应的容积为60立方米，载重为16吨"

    )
    private BigDecimal carLength;

    @DecimalMax(value = "999.999999", message = "车容积最大不能超过999.999999")
    @ApiModelProperty(value = "<span style='color:#FF0000;'> 只有在transportMode为整车类型并且长度为其他或者车型为其他的时候才需要填写</span></br>"
            + "                <span>容积(立方米)，如果已经选择给定的车型和车长则不需要传值，如果选择其他车长，</span></br>"
            + "                <span>则需要传值，最大值为999.999999</span>")
    private BigDecimal carVolume;

    @DecimalMax(value = "99.9999", message = "车载重最大不能超过99.9999")
    @ApiModelProperty(value = " <span style='color:#FF0000;'>只有在transportMode为整车类型并且长度为其他或者车型为其他的时候才需要填写</span></br>"
            + "                <span>载重(吨)，如果已经选择给定的车型和车长则不需要传值，如果选择其他车长，则需要传值</span></br>"
            + "                <span>最大值为99.9999</span>")
    private BigDecimal carWeight;

    @ApiModelProperty(value = "<span style='color:#FF0000;'>只有在transportMode为整车类型的时候才需要填写</span></br>"
            + "                <span>整车数量，只能是 1 到 10的数字，不传值默认整车数量为1</span>")
    private Integer carCount;

    @ApiModelProperty(value = "计费模式，1重量 2体积 3数量，不传值默认计费模式为重量")
    private Integer chargeMode;

    @ApiModelProperty(value = "价格单位：需要与计费模式对应</br>"
            + "重量对应的价格单位：1公斤 2吨</br>"
            + "体积对应的价格单位：3立方米 4升</br>"
            + "数量对应的价格单位： 5个 6托 7台 8箱9包 10捆 11辆 12件 13袋 14架 15盒 16桶 17其他</br>"
            + "如果计费模式、价格单位都没传值，默认价格单位为公斤</br>"
            + "如果计费模式传了值，价格单位没有值，价格单位默认对所选计费模式对应的第一个价格单位")
    private Integer priceUnit;

    @ApiModelProperty(value = "是否保价，0否 1是，不传值默认否", example = "0")
    private Integer insurance;
    @ApiModelProperty(value = "是否提货，0否 1是，不传值默认否", example = "0")
    private Integer pick;
    @ApiModelProperty(value = "是否送货，0否 1是，不传值默认否", example = "0")
    private Integer delivery;
    @ApiModelProperty(value = "是否装货，0否 1是，不传值默认否", example = "0")
    private Integer onLoad;
    @ApiModelProperty(value = "是否卸货，0否 1是，不传值默认否", example = "0")
    private Integer offLoad;
    @ApiModelProperty(value = "货物分类，1普通货物 2危险品 4温控货物（可多选），不传值默认为普通货物")
    private Integer goodsCategory;
    @ApiModelProperty(value = "包装方式，1散箱 2托盘或木箱 3托盘、木箱或不规则形状，不传值默认为散箱", example = "1")
    private Integer packageMode;

    @ApiModelProperty(value = "发货地址经纬度")
    private String fromLocation;
    @ApiModelProperty(value = "收货地址经纬度")
    private String toLocation;

    @ApiModelProperty(value = "发货省code", hidden = true)
    private String fromProvinceCode;
    @ApiModelProperty(value = "发货市code", hidden = true)
    private String fromCityCode;
    @ApiModelProperty(value = "发货区code", hidden = true)
    private String fromDistrictCode;
    @ApiModelProperty(value = "收货省code", hidden = true)
    private String toProvinceCode;
    @ApiModelProperty(value = "收货市code", hidden = true)
    private String toCityCode;
    @ApiModelProperty(value = "收货区code", hidden = true)
    private String toDistrictCode;
    @ApiModelProperty(value = "发货方id", hidden = true)
    private Long customerId;
    @ApiModelProperty(value = "发货方类型", hidden = true)
    private Integer customerType;
    @ApiModelProperty(value = "收货方id", hidden = true)
    private Long consigneeId;
    @ApiModelProperty(value = "时效天数", hidden = true)
    private Integer days;

    @ApiModelProperty(value = "租户id", hidden = true)
    private Long tenantId;
    @ApiModelProperty(value = "用户Id", hidden = true)
    private Long userId;
}
